﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Autoverwaltung.TUI
{
    public class ModellVerwatung : Ansicht
    {
        public ModellVerwatung(IAnsichtManager manager)
            : base(manager) { }

        public override void ZeigeUeberschrift()
        {
            Console.WriteLine("Modelle verwalten");
            Console.WriteLine("------------------------------");
        }

        public override void ZeigeMenue()
        {
            Console.WriteLine("\nAnzeigen (a)");
            Console.WriteLine("Anzeigen nach Hersteller (b)");
            Console.WriteLine("Neu (c)");
            Console.WriteLine("Bearbeiten (d)");
            Console.WriteLine("Loeschen (l)");
            Console.WriteLine("------------------");
            Console.WriteLine("Zum Hauptmenue (z)");

            var key = this.Manager.EinfacheTastenEingabe();
            this.Manager.ConsoleLeeren();
            switch (key)
            {
                case ConsoleKey.A:
                    this.ZeigeModelle();
                    break;

                case ConsoleKey.B:
                    this.ZeigeModelleNachHersteller();
                    break;

                case ConsoleKey.C:
                    this.NeuesModell();
                    break;

                case ConsoleKey.D:
                    this.BearbeiteModell();
                    break;

                case ConsoleKey.L:
                    this.LoescheModell();
                    break;

                case ConsoleKey.Z:
                    this.Manager.WechselAnsicht(Ansichten.Hauptmenue);
                    break;
            }
            Console.WriteLine("\n--------------------------------------------\n\n");
            this.ZeigeMenue();
        }

        private void ZeigeModelle()
        {
            Model.Modell[] modelle = this.Manager.Fachkonzept.GibModelle();

            Console.WriteLine("Auflistung aller Modelle:");
            Console.WriteLine("--------------------------------------------");
            if (modelle != null && modelle.Length > 0)
            {
                foreach (Model.Modell h in modelle)
                {
                    this.ZeigeModell(h);
                }
            }
            else
            {
                Console.WriteLine("Es wurden keine Modelle gefunden.");
            }
        }

        private void ZeigeModelleNachHersteller()
        {
          this.ZeigeHersteller();

          Model.Hersteller hersteller = null;
          do
          {
            int herstellerId = (int)this.Manager.ZahlenEingabe("Geben Sie bitte die Id eins Herstellers ein:");
            hersteller = this.Manager.Fachkonzept.GibHersteller(herstellerId);

          } while (hersteller == null);

          Model.Modell[] modelle = this.Manager.Fachkonzept.GibModelleNach(hersteller);

          Console.WriteLine("Auflistung aller Modelle mit Hersteller-ID: " + hersteller.Id + " (" + hersteller.Name + "):");
          Console.WriteLine("--------------------------------------------");
          if (modelle != null && modelle.Length > 0)
          {
            foreach (Model.Modell h in modelle)
            {
              this.ZeigeModell(h);
            }
          }
          else
          {
            Console.WriteLine("Es wurden keine Modelle gefunden.");
          }
        }

        private void ZeigeModell(Model.Modell modell)
        {
            Console.WriteLine("ID: " + modell.Id + ", " + modell.Bezeichnung + ", Hersteller: " + ((modell.Hersteller != null) ? modell.Hersteller.Name : ""));
        }

        private void ZeigeHersteller()
        {
          Model.Hersteller[] hersteller = this.Manager.Fachkonzept.GibHersteller();

          Console.WriteLine("Auflistung aller Hersteller:");
          Console.WriteLine("--------------------------------------------");
          if (hersteller != null && hersteller.Length > 0)
          {
            foreach (Model.Hersteller h in hersteller)
            {
              Console.WriteLine("ID: " + h.Id + ", " + h.Name);
            }
          }
          else
          {
            Console.WriteLine("Es wurden keine Hersteller gefunden.");
          }
        }

        private void ModellErstellenUndSpeichern(bool isEdit = false, int id = int.MinValue)
        {
            string bezeichnung = this.Manager.EinfacheTextEingabe("Geben Sie bitte die Bezeichnung ein:");

            if (bezeichnung == "")
            {
                bezeichnung = null;
            }

            Model.Hersteller hersteller = null;
            do
            {
                this.ZeigeHersteller();
                string herstellerId = this.Manager.EinfacheTextEingabe("\nGeben Sie bitte die Id eins Herstellers ein. (Enter zum ueberspringen):");

                if (herstellerId == null || herstellerId == "")
                {
                    break;
                }

                decimal number;
                decimal.TryParse(herstellerId, out number);
                hersteller = this.Manager.Fachkonzept.GibHersteller((int)number);

            } while (hersteller == null);

            if (this.Manager.JaNeinFrage("Moechten Sie die Aenderungen Speichern?"))
            {
                var modell = new Model.Modell() { Bezeichnung = bezeichnung };

                if (hersteller != null)
                {
                  modell.Hersteller = hersteller;
                }

                bool b;
                if (isEdit)
                {
                    b = this.Manager.Fachkonzept.BearbeiteModell(id, modell);
                }
                else
                {
                    b = this.Manager.Fachkonzept.NeuesModell(modell);
                }
                if (b)
                {
                    Console.WriteLine("Das Modell wurde erfolgreich gespeichert.");
                }
                else
                {
                    Console.WriteLine("Das Modell konnte nicht gespeichert werden.");
                }
            }
        }

        private void NeuesModell()
        {
            Console.WriteLine("Neues Modell:\n");
            this.ModellErstellenUndSpeichern();
        }

        private void BearbeiteModell()
        {
            this.ZeigeModelle();

            Model.Modell modell = null;
            do
            {
                int id = (int)this.Manager.ZahlenEingabe("Waehlen Sie das Modell aus, welches Sie bearbeiten moechen. ID:");
                modell = this.Manager.Fachkonzept.GibModell(id);
            }
            while (modell == null);

            this.Manager.ConsoleLeeren();
            Console.WriteLine("Aktuelle Modell Daten:");
            this.ZeigeModell(modell);

            Console.WriteLine("\nNeue Daten:");
            this.ModellErstellenUndSpeichern(true, modell.Id);
        }

        private void LoescheModell()
        {
            this.ZeigeModelle();
            int id = (int)this.Manager.ZahlenEingabe("Waehlen Sie das zu loeschenden Modell aus. ID:");
            if (this.Manager.JaNeinFrage("Moechten Sie das Modell mit der ID: " + id + " wirklich loeschen?"))
            {
                if (this.Manager.Fachkonzept.LoescheModell(id))
                {
                    Console.WriteLine("Das Modell wurde erfolgreich geloescht.");
                }
                else
                {
                    Console.WriteLine("Das Modell konnte nicht gelöscht werden.");
                }
            }
        }
    }
}
